package VNS;

import java.util.ArrayList;

public class Graphe {
	
	private int[]	 tabAssoc;//tab[unite] = site;
	private int[][] matriceDistance;
	private ArrayList<Arc> flux;
	
	public Graphe(){
		this.flux = new ArrayList<Arc>();
		
	}
	
	/**
	 * 
	 * @return le cout total de la solution
	 */
	public int calculCoutTotal(){
		int res=0;
		for (Arc a: this.flux){			
			res += matriceDistance[ tabAssoc[a.getUnite1()] ][ tabAssoc[a.getUnite2()] ]  *   a.getCoutFlux();			
		}		
		return res;
	}
	
	/**
	 * 
	 * @param tabAssoc2
	 * @return le cout total avec un autre tableau associatif
	 */
	public int calculCoutTotal(int[] tabAssoc2) {
		int res=0;
		for (Arc a: this.flux){
			res += matriceDistance[ tabAssoc2[a.getUnite1()] ][ tabAssoc2[a.getUnite2()] ]  *   a.getCoutFlux();			
		}		
		return res;
	}
	
	/**
	 * 
	 * @return le tableau associatif
	 */
	public int[] getTabAssoc() {
		return tabAssoc;
	}
	
	public void setTabAssoc(int [] tabAssoc) {
		for(int i=0; i<tabAssoc.length; ++i) {
			this.tabAssoc[i] = tabAssoc[i];	
		}
	}
	
	public void createTabAssoc() {
		if(matriceDistance != null) {
			int taille = matriceDistance[0].length;
			System.out.println("taille "+taille);
			if(taille >= 2) {
				boolean continu = true;
				int tailleInitiale = taille-1;//11
				
				tabAssoc = new int[taille];
				--taille;
				
				tabAssoc[taille] = (int)(Math.random()*(tailleInitiale+1));
				
				while(taille > 0) {
					continu = true;
					tabAssoc[taille-1] = (int)(Math.random()*(tailleInitiale+1));
					for(int i = tailleInitiale; i >= taille; --i) {
						if(tabAssoc[taille-1] == tabAssoc[i]) {
							continu = false;
						}
					}
					if(continu) {
						--taille;
					}
				}
			}
		}
	}
	
	public void setMatriceDistance(int[][] m){
		this.matriceDistance = m;
	}
	
	public void addArc(Arc a){
		this.flux.add(a);	
	}
	
	public void printGraphe(){
		
		for (Arc a : this.flux){
			System.out.println(a.getUnite1() +" : "+a.getUnite2()+" => "+a.getCoutFlux());
		}
	}

}
